﻿using System.Web.Mvc;
using zeus.Core;
using SharpArch.Web.NHibernate;
using SharpArch.Core;
using SharpArch.Core.PersistenceSupport;
using System.Collections.Generic;
using Webdiyer.WebControls.Mvc;
using System;
using System.Linq;
using zeus.Core.RepositoryInterfaces;
using zeus.Web.Controllers.Helpers;

namespace zeus.Web.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        #region constructor
        private readonly IRepository<Cliente> clienteRepository;
        private readonly IUsuarioRepository usuarioRepository;
        private readonly IUbicacionRepository ubicacionRepository;
        private readonly IUnidadRepository unidadRepository;
        private readonly IGrupoUsuarioRepository grupoUsuarioRepository;
        private readonly IRepository<Ubicacion> ubicacionesRepository;
        private readonly IEventoRepository eventosRepository;
        
        public HomeController(IRepository<Cliente> clienteRepository,
            IUsuarioRepository usuarioRepository, 
            IUbicacionRepository ubicacionRepository,
            IUnidadRepository unidadRepository,
            IGrupoUsuarioRepository grupoUsuarioRepository,
            IRepository<Ubicacion> ubicacionesRepository,
            IEventoRepository eventosRepository)
        {

            Check.Require(grupoUsuarioRepository != null, "grupoUsuarioRepository may not be null");
            this.grupoUsuarioRepository = grupoUsuarioRepository;

            Check.Require(usuarioRepository != null, "usuarioRepository may not be null");
            this.usuarioRepository = usuarioRepository;

            Check.Require(clienteRepository != null, "clienteRepository may not be null");
            this.clienteRepository = clienteRepository;

            Check.Require(ubicacionRepository != null, "ubicacionRepository may not be null");
            this.ubicacionRepository = ubicacionRepository;

            Check.Require(unidadRepository != null, "unidadRepository may not be null");
            this.unidadRepository = unidadRepository;

            Check.Require(ubicacionesRepository != null, "ubicacionesRepository may not be null");
            this.ubicacionesRepository = ubicacionesRepository;

            Check.Require(eventosRepository != null, "eventosRepository may not be null");
            this.eventosRepository = eventosRepository;
        }

        public WorkingSession workingSession
        {
            get
            {
                if (Session["WorkingSession"] == null)                
                    throw new SessionExpiredException();
                
                return Session["WorkingSession"] as WorkingSession;
            }
            set
            {
                Session["WorkingSession"] = value;
            }
        }
        #endregion

        /// <summary>
        /// Pagina principal.
        /// </summary>
        /// <returns></returns>
        [Transaction, Authorize]

        public ActionResult Index(int? id, int? clienteId, int? und, int? grupoId, int? ban, int? eventoId, int? ban1, int? gpsId, int? batPri, int? batAlt, int? estadoLogico, int? velocidad)

        {
            try
            {                
                // Valido que la sesion se encuentre activa
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();

                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();



                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {
                                       
                    
                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    //grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und!=0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");
                    
                    
                }


                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre",grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);


                if (grupoId != null && velocidad != null)

                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoVelocidades(grupoId ?? grupos[0].Id, velocidad ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && velocidad != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorVelocidades(und ?? unidades[0].Id, velocidad ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoEstadoLogico(grupoId ?? grupos[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadEstadoLogico(und ?? unidades[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(gpsId ?? 1, clienteId ?? clientes[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps(clienteId ?? clientes[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                //if (eventoId != null)
                //{

                    if (und != null && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (grupoId != null && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 0 && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 0 && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 1 && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento(clienteId ?? clientes[0].Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 1 && eventoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                //}


                if (und != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (grupoId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                //else
                //{
                    //if (ban == 0)
                    //{
                        if (clienteId != null && grupoId == null && ban == 0)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else if (clienteId == null && grupoId == null && ban == 0 )
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                    //}

                    if (und != 0 && grupoId==null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                       
                    }

                    //else
                    //{
                        if (clienteId != null && und==0 && grupoId==null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else if (clienteId == null && und == 0 && grupoId == null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else 
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        
                        
                        }
                    //}
                //}



            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
        }
                        
            


        [Transaction, Authorize]
        public ActionResult ListaDetallada(int? id, int? clienteId, int? und, int? grupoId, int? ban,int? eventoId,int? ban1,int? gpsId,int? batPri,int? batAlt, int? estadoLogico, int? menu)
        {

            try
            {
                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();


                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {
                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und != 0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");
                }

                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre", grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);



                //IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                //return View(ubicaciones);

                if (grupoId != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoEstadoLogico(grupoId ?? grupos[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadEstadoLogico(und ?? unidades[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && gpsId!=null )
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(gpsId ?? 1, clienteId ?? clientes[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }



                 if (clienteId != null && ban1 == 1 && gpsId!=null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps( clienteId ?? clientes[0].Id, gpsId ?? 1);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                 else if (clienteId == null && ban1 == 1 && gpsId != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }


                 if (clienteId != null && ban1 == 1 && batPri != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }
                 else if (clienteId == null && ban1 == 1 && batPri != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }

                 if (clienteId != null && ban1 == 1 && batAlt != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }
                 else if (clienteId == null && ban1 == 1 && batAlt != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }


                 if (clienteId != null && ban1 == 1 && estadoLogico != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }
                 else if (clienteId == null && ban1 == 1 && estadoLogico != null)
                 {
                     IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                     PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                     return View(ubicaciones);
                 }

                
                if (eventoId != null)
                {

                    if (und != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (grupoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento( clienteId ?? clientes[0].Id,eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    

                }


                if (und != null && ban1==2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (grupoId != null)
                {



                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);


                }
                else
                {
                   
                    if (ban == 0)
                    {
                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);

                        }

                    }
                    if (und != 0 )
                    {

                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    else
                    {

                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);


                        }


                    }

                }

               

            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }


            ////////////////////////////////////////
           



        }

        [Transaction, Authorize]
        public ActionResult ListaTecnica(int? id, int? clienteId, int? und, int? grupoId, int? ban, int? eventoId, int? ban1, int? gpsId, int? batPri, int? batAlt, int? estadoLogico, int? menu)
        {

            try
            {
                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();


                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {
                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und != 0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");
                }

                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre", grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);



                //IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                //return View(ubicaciones);

                if (grupoId != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoEstadoLogico(grupoId ?? grupos[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadEstadoLogico(und ?? unidades[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(gpsId ?? 1, clienteId ?? clientes[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }



                if (clienteId != null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps(clienteId ?? clientes[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (eventoId != null)
                {

                    if (und != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (grupoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento(clienteId ?? clientes[0].Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }


                }


                if (und != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (grupoId != null)
                {



                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);


                }
                else
                {

                    if (ban == 0)
                    {
                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);

                        }

                    }
                    if (und != 0)
                    {

                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    else
                    {

                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);


                        }


                    }

                }



            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }


            ////////////////////////////////////////




        }
        [Transaction, Authorize]

        public ActionResult ListaUbicacion(int? id, int? clienteId, int? und, int? grupoId, int? ban, int? eventoId, int? ban1, int? gpsId, int? batPri, int? batAlt, int? estadoLogico, int? velocidad)
        {
            try
            {
                // Valido que la sesion se encuentre activa
                if (Session["WorkingSession"] == null)
                    throw new SessionExpiredException();

                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();



                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {


                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    //grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und != 0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");


                }


                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre", grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);


                if (grupoId != null && velocidad != null)
                {


                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoVelocidades(grupoId ?? grupos[0].Id, velocidad ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }



                if (und != null && velocidad != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorVelocidades(und ?? unidades[0].Id, velocidad ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoEstadoLogico(grupoId ?? grupos[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadEstadoLogico(und ?? unidades[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (und != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(gpsId ?? 1, clienteId ?? clientes[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }



                if (clienteId != null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps(clienteId ?? clientes[0].Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (clienteId != null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (clienteId != null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }
                else if (clienteId == null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (eventoId != null)
                {

                    if (und != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);

                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (grupoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    if (clienteId != null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento(clienteId ?? clientes[0].Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }
                    else if (clienteId == null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }


                }


                if (und != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);
                }


                if (grupoId != null)
                {



                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                    return View(ubicaciones);


                }
                else
                {

                    if (ban == 0)
                    {
                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);

                        }

                    }
                    if (und != 0)
                    {

                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        return View(ubicaciones);
                    }

                    else
                    {

                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);
                            PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                            return View(ubicaciones);


                        }


                    }

                }



            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
        }

        [Transaction]
        public ActionResult HomeMapa3()
        {


            ////////////////////////////////////////
            string url = "1";


            List<object> datos = new List<object> { url };
            //object toda una lista del objeto ubicacion...selecciono los datos q dese y no todo el objeto 


            return View("HomeMapa", datos);


        }

        [Transaction]
        public ActionResult HomeMapa(string url)
        {

            string[] parts = url.Split(';');

            int total;

            total = parts.Length;
            string url1="";
            string ot="";
            for (int i = 0; i < total; i++)
            {
                System.Console.WriteLine(i);
                url1 = url1+parts[i] + "&";
                ot = ot+parts[i] + "&";
            }



            System.Console.WriteLine(ot);
            

            //url1=parts[0]+"&"+parts[1];

            List<object> datos = new List<object> { ot };
            //object toda una lista del objeto ubicacion...selecciono los datos q dese y no todo el objeto 



            return View("HomeMapa",datos);


        }
        [Transaction,HttpPost]
        public ActionResult HomeMapa(int? id, int? clienteId, int? und, int? grupoId, int? ban, int? eventoId, int? ban1, int? gpsId, int? batPri, int? batAlt, int? estadoLogico, int? velocidad)
        
        {

            try
            {
                IList<Cliente> clientes = clienteRepository.GetAll();
                ViewData["Clientes"] = new SelectList(clientes, "Id", "Nombre", clienteId);

                IList<Unidad> unidades = new List<Unidad>();
                IList<Grupo> grupos = new List<Grupo>();
                IList<Evento> eventos = new List<Evento>();


                if (usuarioRepository.IsInRole(User.Identity.Name, "admin"))
                {
                    unidades = unidadRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    grupos = grupoUsuarioRepository.GetByCliente(clienteId ?? clientes[0].Id);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = true;
                }
                else
                {
                    unidades = unidadRepository.GetByUsuario(workingSession.Usuario.Id);
                    grupos = grupoUsuarioRepository.GetByUsuario(workingSession.Usuario);
                    eventos = eventosRepository.GetNombreEventos();

                    ViewData["IsAdmin"] = false;
                }

                Check.Require(unidades.Count > 0, "No existen unidades asignadas");

                Dictionary<string, object> filtro = new Dictionary<string, object>();

                List<int> unidadesID = new List<int>();

                // Validar que exista la Unidad
                if (und != null && (bool)ViewData["IsAdmin"] == false && und != 0)
                {
                    unidades.ToList().ForEach(p => unidadesID.Add(p.Id));
                    Check.Require(unidadesID.Contains(und.Value), "No se puede proceder con el ID indicado");
                }

                ViewData["CodigoUnidad"] = new SelectList(unidades, "Id", "Nombre", und ?? 0);
                ViewData["Grupos"] = new SelectList(grupos, "Id", "Nombre", grupoId ?? 0);
                ViewData["EventosUnidad"] = new SelectList(eventos, "Id", "Nombre", eventoId ?? 0);



                //IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                //return View(ubicaciones);

                if (grupoId != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoEstadoLogico(grupoId ?? grupos[0].Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (und != null && estadoLogico != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadEstadoLogico(und ?? unidades[0].Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (und != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaAlterna(und ?? unidades[0].Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (grupoId != null && batAlt != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaAlterna(grupoId ?? grupos[0].Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (und != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadBateriaPrinciapl(und ?? unidades[0].Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (grupoId != null && batPri != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoBateriaPrinciapl(grupoId ?? grupos[0].Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (und != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUnidadGpsValid(und ?? unidades[0].Id, gpsId ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (grupoId != null && gpsId != null)
                {

                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoGpsValid(grupoId ?? grupos[0].Id, gpsId ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (clienteId != null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGpsPorCliente(gpsId ?? 1, clienteId ?? clientes[0].Id);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 0 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (clienteId != null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 0 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (clienteId != null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 0 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (clienteId != null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 0 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }



                if (clienteId != null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteGps(clienteId ?? clientes[0].Id, gpsId ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 1 && gpsId != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioGps(workingSession.Usuario.Id, gpsId ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (clienteId != null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaPrinciapl(clienteId ?? clientes[0].Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 1 && batPri != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaPrinciapl(workingSession.Usuario.Id, batPri ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (clienteId != null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteBateriaAlterna(clienteId ?? clientes[0].Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 1 && batAlt != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioBateriaAlterna(workingSession.Usuario.Id, batAlt ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (clienteId != null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporClienteEstadoLogico(clienteId ?? clientes[0].Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }
                else if (clienteId == null && ban1 == 1 && estadoLogico != null)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGruporUsuarioEstadoLogico(workingSession.Usuario.Id, estadoLogico ?? 1);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (eventoId != null)
                {

                    if (und != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorUnidad(eventoId ?? eventos[0].Id, und ?? unidades[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }

                    if (grupoId != null)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorGrupo(eventoId ?? eventos[0].Id, grupoId ?? grupos[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }

                    if (clienteId != null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorEventoPorCliente(eventoId ?? eventos[0].Id, clienteId ?? clientes[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }
                    else if (clienteId == null && ban1 == 0)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }

                    if (clienteId != null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoClienteEvento(clienteId ?? clientes[0].Id, eventoId ?? eventos[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }
                    else if (clienteId == null && ban1 == 1)
                    {
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuarioEvento(workingSession.Usuario.Id, eventoId ?? eventos[0].Id);
                        List<Posicion> posiciones = new List<Posicion>();
                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }


                        return Json(posiciones);
                    }


                }


                if (und != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }

                if (grupoId != null && ban1 == 2)
                {
                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);
                }


                if (grupoId != null)
                {



                    IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupo(grupoId ?? grupos[0].Id);
                    List<Posicion> posiciones = new List<Posicion>();
                    foreach (var item in ubic)
                    {
                        Posicion pos = new Posicion()
                        {
                            Latitud = item.Latitud,
                            Longitud = item.Longitud,
                            NombreUnidad = item.Unidad.Nombre,
                            PlacaUnidad = item.Unidad.Placa,
                            Fecha = item.Fecha,
                            Velocidad = item.Velocidad,
                            Grados = item.Grados,
                            Evento = item.CodigoEvento,
                            EventoNombre = item.Evento.Nombre

                        };

                        posiciones.Add(pos);
                    }


                    return Json(posiciones);


                }
                else
                {

                    if (ban == 0)
                    {
                        if (clienteId != null)
                        {
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoCliente(clienteId ?? 1);

                            List<Posicion> posiciones = new List<Posicion>();
                            foreach (var item in ubic)
                            {
                                Posicion pos = new Posicion()
                                {
                                    Latitud = item.Latitud,
                                    Longitud = item.Longitud,
                                    NombreUnidad = item.Unidad.Nombre,
                                    PlacaUnidad = item.Unidad.Placa,
                                    Fecha = item.Fecha,
                                    Velocidad = item.Velocidad,
                                    Grados = item.Grados,
                                    Evento = item.CodigoEvento,
                                    EventoNombre = item.Evento.Nombre

                                };

                                posiciones.Add(pos);
                            }


                            return Json(posiciones);
                        }
                        else
                        {

                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorGrupoUsuario(workingSession.Usuario.Id);

                            List<Posicion> posiciones = new List<Posicion>();
                            foreach (var item in ubic)
                            {
                                Posicion pos = new Posicion()
                                {
                                    Latitud = item.Latitud,
                                    Longitud = item.Longitud,
                                    NombreUnidad = item.Unidad.Nombre,
                                    PlacaUnidad = item.Unidad.Placa,
                                    Fecha = item.Fecha,
                                    Velocidad = item.Velocidad,
                                    Grados = item.Grados,
                                    Evento = item.CodigoEvento,
                                    EventoNombre = item.Evento.Nombre

                                };

                                posiciones.Add(pos);
                            }


                            return Json(posiciones);

                        }

                    }
                    if (und != 0)
                    {
                        //aki es la vuelta
                        //IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);
                        //return View(ubic);

                        List<Posicion> posiciones = new List<Posicion>();
                        IList<Ubicacion> ubic = ubicacionRepository.GetUbicaciones(und ?? unidades[0].Id);
                        //PagedList<Ubicacion> ubicaciones = new PagedList<Ubicacion>(ubic, id ?? 1, 50);

                        foreach (var item in ubic)
                        {
                            Posicion pos = new Posicion()
                            {
                                Latitud = item.Latitud,
                                Longitud = item.Longitud,
                                NombreUnidad = item.Unidad.Nombre,
                                PlacaUnidad = item.Unidad.Placa,
                                Fecha = item.Fecha,
                                Velocidad = item.Velocidad,
                                Grados = item.Grados,
                                Evento = item.CodigoEvento,
                                EventoNombre = item.Evento.Nombre

                            };

                            posiciones.Add(pos);
                        }

                      
                        return Json(posiciones);

                    }

                    else
                    {

                        if (clienteId != null)
                        {
                            List<Posicion> posiciones = new List<Posicion>();
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorCliente(clienteId ?? 1);

                            foreach (var item in ubic)
                            {
                                Posicion pos = new Posicion()
                                {
                                    Latitud = item.Latitud,
                                    Longitud = item.Longitud,
                                    NombreUnidad = item.Unidad.Nombre,
                                    PlacaUnidad = item.Unidad.Placa,
                                    Fecha = item.Fecha,
                                    Velocidad = item.Velocidad,
                                    Grados = item.Grados,
                                    Evento = item.CodigoEvento,
                                    EventoNombre = item.Evento.Nombre

                                };

                                posiciones.Add(pos);
                            }


                            return Json(posiciones);
                        }
                        else
                        {
                            List<Posicion> posiciones = new List<Posicion>();
                            IList<Ubicacion> ubic = ubicacionRepository.GetUbicacionesPorUsuario(workingSession.Usuario.Id);

                            foreach (var item in ubic)
                            {
                                Posicion pos = new Posicion()
                                {
                                    Latitud = item.Latitud,
                                    Longitud = item.Longitud,
                                    NombreUnidad = item.Unidad.Nombre,
                                    PlacaUnidad = item.Unidad.Placa,
                                    Fecha = item.Fecha,
                                    Velocidad = item.Velocidad,
                                    Grados = item.Grados,
                                    Evento = item.CodigoEvento,
                                    EventoNombre = item.Evento.Nombre

                                };

                                posiciones.Add(pos);
                            }


                            return Json(posiciones);

                        }


                    }

                }



            }
            catch (PreconditionException ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }
            catch (SessionExpiredException)
            {
                TempData["ErrorMessage"] = "Sesión Expirada!";
                TempData["Expire"] = true;
                return RedirectToAction("Error", "Shared");
            }
            catch (Exception ex)
            {
                TempData["ErrorMessage"] = ex.Message;
                return RedirectToAction("Error", "Shared");
            }


            ////////////////////////////////////////




        }
        
        
    
    }
}
